home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / ramset.arc / RAMSET.ASM next >
Encoding:
Assembly Source File  |  1985-10-12  |  12.2 KB  |  412 lines

  1. PAGE      64,132
  2. TITLE      RAMSET.ASM    PC-DOS DEVICE DRIVER TO INITIALIZE MEMORY
  3. PAGE
  4. COMMENT   \
  5.  
  6.     PROGRAM NAME:    RAMSET (Version 1.2 OCTOBER 1985)
  7.  
  8.     FUNCTION:    PC-DOS DEVICE DRIVER TO INITIALIZE RAM
  9.  
  10.       AUTHOR:    MARK ALLEN BYRD, CDP    (312) 623-3833
  11.              38141 HOLDRIDGE AVENUE
  12.              WAUKEGAN, IL 60087
  13.  
  14. ACKNOWLEDGEMENTS:    DANIEL O'BRIEN, TOM PERRY
  15.              MARK FRANKLIN, DAVID BRADLEY
  16.  
  17.        USAGE:    1) ASSEMBLE WITH IBM MACRO ASSEMBLER
  18.              2) LINK WITH PC-DOS LINKAGE EDITOR
  19.              3) CONVERT TO BIN FROM EXE WITH EXE2BIN
  20.              4) INSTALL IN CONFIG.SYS WITH DEVICE=RAMSET.SYS
  21.  
  22.        NOTES:    DEVICE=RAMSET.SYS SHOULD BE THE FIRST STATEMENT
  23.              IN YOUR CONFIG.SYS FILE!
  24.  
  25.     ABSTRACT:    THE DRIVER IS TO BE CALLED AFTER BOOT BY IBMBIO.COM.
  26.              DRIVER INITIALIZATION WILL DISPLAY ANY PARMS INCLUDED
  27.              IN CONFIG.SYS AND OTHER SYSTEM INFORMATION, INCLUDING
  28.              THE INDICATED RAM SIZE,  THE DRIVER WILL THE SEARCH FOR
  29.              ADDITIONAL RAM STARTING AT THE ADDRESS INDICATED.
  30.  
  31.              ANY ACTIVE RAM FOUND ABOVE THAT INDICATED WILL BE
  32.              INITIALIZED TO PREVENT POSSIBLE PARITY ERRORS.  THE
  33.              ACTUAL AMOUNT OF ACTIVE RAM WILL BE RESET IN THE
  34.              SYSTEM "CONTROL INFORMATION AREA" (@ 40:0013).  A BIOS
  35.              INTERRUPT IS USED TO RESET THE SYSTEM AND PICK-UP THE
  36.              MODIFIED CONTROL INFORMATION.
  37.  
  38.              IF THE DRIVER RECOGNIZES THAT IT HAS ALREADY BEEN RUN, OR
  39.              THAT THE INDICATED MEMORY IS EQUAL TO ACTUAL MEMORY, THE
  40.                      THE DRIVER TERMINATES, RELEASING MOST OF IT'S MEMORY.
  41.  
  42.              MESSAGES ARE ISSUED INDICATING THE DRIVERS STATUS.
  43.  
  44.  
  45.      APPLICATION:    THIS DRIVER HAS PRIMARY APPLICATION FOR AN IBM PC-1 WITH
  46.              THE ORIGINAL ROM BIOS CHIP.  A COMMON CONFIGURATION FOR
  47.              THIS MACHINE INCLUDES THE ADDITION OF BOTH 256k AND
  48.              384k MEMORY EXPANSION BOARDS.  THIS COMBINATION CAN
  49.              ALLOW UPTO 704k OF RAM TO BE PHISICALLY INSTALLED.
  50.  
  51.              THE MEMORY MAP OF THE IBM PC SUPPORTS WORKING RAM THRU
  52.              640k.  THE NEXT TWO 64k BLOCKS ARE RESERVED FOR DISPLAY
  53.              ADAPTOR MEMORY.  UNLESS AN EXTENDED FUNCTION DISPLAY
  54.                      ADAPTOR, SUCH AS IBM'S "EGA" IS INSTALLED, THE FIRST 64K
  55.              BLOCK OF THIS  ADDRESS SPACE CAN BE USED AS WORKING RAM.
  56.  
  57.                      THE PC'S POWER ON SELF TEST (POST) WILL ONLY TEST AND
  58.              THE AMOUNT OF MEMORY INDICATED BY SYSTEM BOARD SWITCHES.
  59.              IN A PC-1, THESE SWITCHES CAN ONLY BE USED TO INDICATE
  60.              544k.  IN NO MODEL WILL THE POST ALLOW THE INITIALIZATION
  61.              OF MEMORY GREATER THAN 640k.  ADDITIONALLY, THE POST
  62.              MEMORY INITIALIZATION CODE IN A PC-1 IS SLOW!
  63.  
  64.                      THIS DRIVER PERMITS SETTING THE PC'S SYSTEM BOARD SWITCHES
  65.              TO INDICATE LESS THAT THE ACTUAL AMOUNT OF INSTALLED RAM.
  66.              A SWITCH SETTING OF 64k EFFECTS THE FASTEST POSSIBLE
  67.              COMPLETION OF THE POST.
  68.  
  69.  
  70.      USAGE NOTES:    THE AST "6-PACK" BOARD AND CLONES (BT-6, ETC.) WILL NOT
  71.              SUPPORT MEMORY ADDRESSES ABOVE 640k. IF THIS BOARD IS USED
  72.                      IT MUST HAVE IT'S STARTING ADDRESS AT OR BELOW 320k.  THIS
  73.              IMPLIES A MEMORY BOARD MUST BE INSTALLED "ABOVE" THE 6-PACK
  74.              TO ACCESS 704k.
  75.  
  76.                      ONE COMMON BOARD IN EARLY PC'S IS THE SEATTLE "RAM+".  THIS
  77.              BOARD HAS A COUPLE OF PROBLEMS...    1) IT IS NOT COMPATIBLE
  78.              WITH THE BIOS UPGRADE CHIP.  2) THE SYSTEM SWITCHES MUST
  79.              BE USED TO INDICATE AT LEAST THE 1ST 64K IS PRESENT ON THE
  80.              BOARD.  IF THIS BOARD IS USED IN COMBINATION WITH AN AST
  81.              "6-PACK", SYSTEM BOARD SWITCHES MUST INDICATE 512k PRESENT.
  82.  
  83.       \
  84.  
  85.  
  86.  
  87. ;      MACRO DEFINITIONS
  88.  
  89.  
  90. MSG      MACRO  TEXT
  91.       MOV     DX,OFFSET TEXT
  92.       MOV     AH,09h
  93.       INT     21h
  94.       ENDM
  95.  
  96.  
  97. PUSHALL   MACRO
  98.       PUSH     DS
  99.       PUSH     ES
  100.       PUSH     AX
  101.       PUSH     BX
  102.       PUSH     CX
  103.       PUSH     DX
  104.       PUSH     DI
  105.       PUSH     SI
  106.       ENDM
  107.  
  108. POPALL      MACRO
  109.       POP     SI
  110.       POP     DI
  111.       POP     DX
  112.       POP     CX
  113.       POP     BX
  114.       POP     AX
  115.       POP     ES
  116.       POP     DS
  117.       ENDM
  118.  
  119.  
  120.  
  121. ;      STRUCTURE DEFINITIONS
  122.  
  123.  
  124. RH      EQU     DS:[BX]           ;BASE FOR RH STRUCTURE
  125.  
  126. RHSTRUC   STRUC
  127.       DB     ?,?
  128. COMMAND   DB     ?
  129. STATUS      DW     ?
  130.       DQ     ?
  131. UNITS      DB     ?
  132. END_OFF   DW     ?
  133. END_SEG   DW     ?
  134. BPB_PTR   DD     ?
  135.       DB     ?
  136. RHSTRUC   ENDS
  137.  
  138. CMD_INIT  EQU     0               ;RH COMMAND - INTIALIZE
  139.  
  140. STAT_DONE EQU     01h               ;RH STATUS  - DONE
  141.  
  142.  
  143. ;      DEVICE DRIVER
  144.  
  145. CODE      SEGMENT
  146.       ASSUME CS:CODE,DS:CODE,ES:CODE
  147.  
  148.  
  149. ;      DEVICE DRIVER HEADER
  150.  
  151.       DD     -1               ;NEXT DEVICE
  152.       DW     8000h               ;CHARACTER DEVICE
  153.       DW     STRATEGY           ;PTR TO DEVICE STRATEGY
  154.       DW     INTERRUPT           ;PTR TO DEVICE INTERRUPT HANDLER
  155. DEV_NAME  DB     'RAMSETZZ'            ;DEVICE NAME
  156.  
  157.  
  158. ;      WORK AREA
  159.  
  160. RH_PTR      LABEL  DWORD               ;REQUEST HEADER ADDRESS
  161. RH_SEG      DW     0               ;SEGMENT
  162. RH_OFF      DW     0               ;OFFSET
  163.  
  164.  
  165. STRATEGY  PROC     FAR               ;DEVICE STRATEGY
  166.  
  167.       MOV     CS:RH_SEG,ES           ;SAVE DEVICE REQUEST HEADER ADDRESS
  168.       MOV     CS:RH_OFF,BX           ;...
  169.       RET
  170.  
  171. STRATEGY  ENDP
  172.  
  173.  
  174. INTERRUPT PROC     FAR               ;DEVICE INTERRUPT HANDLER
  175.  
  176.       CLD                   ;CLEAR DIRECTION FLAGS
  177.       PUSHALL               ;SAVE ALL REGISTERS
  178.  
  179.       CALL     MEMSET            ;GO TO IT !!!
  180.  
  181.       MOV     BX,RH_OFF           ;ABORT DRIVER...
  182.       MOV     AX,RH_SEG           ;GET RH ADDRESS
  183.       MOV     ES,AX               ;
  184.       MOV     DS,AX               ;
  185.       MOV     AX,OFFSET RELEASE     ;SET ENDING ADDRESS OFFSET
  186.       MOV     RH.END_OFF,AX           ;
  187.       MOV     AX,CS               ;SET ENDING ADDRESS SEGMENT = CS
  188.       MOV     RH.END_SEG,AX           ;
  189.       XOR     AX,AX               ;SET STATUS FOR "NO ERROR"
  190.       OR     AH,STAT_DONE           ;SET STATUS FOR "DONE"
  191.       MOV     RH.STATUS,AX
  192.  
  193.       POPALL               ;RESTORE ALL REGISTERS
  194.       RET                   ;RETURN TO CALLER (DOS)
  195.  
  196. RELEASE   DB     ?
  197.  
  198. INTERRUPT ENDP
  199.  
  200.  
  201. MEMSET      PROC     NEAR
  202.       JMP     START
  203.  
  204. CR      EQU     0dh               ;ASCII CARRIGE RETURN
  205. LF      EQU     0ah               ;ASCII LINE FEED
  206. BS      EQU     08h               ;ASCII BACKSPACE
  207.  
  208. MEM_SIZE  DW                   ;INITIAL MEMORY SIZE
  209. TEST_PARA DW                   ;CURRENT PARAGRAPH ADDRESS
  210.  
  211. MSG1      DB     "RAMSET (V1.02)  PC-DOS DEVICE DRIVER TO INITIALIZE MEMORY$"
  212.  
  213. MSG2      DB     CR,LF,LF,"DEVICE = "
  214. DEV_PARM  DB     80 DUP (?)
  215.       DB     "$"
  216.  
  217. MSG3      DB     CR,LF,LF,"ROM BIOS DATE = "
  218. ROM_DATE  DB     "MM/DD/YY"
  219.       DB     "$"
  220.  
  221. MSG4      DB     CR,LF,LF,"INDICATED MEMORY SIZE IS$"
  222. KBYTE1      DB     "     ","k.","$"
  223.  
  224. MSG5      DB     "   ACTUAL MEMORY SIZE IS          $"
  225.  
  226. KBYTE2      DB     BS,BS,BS,BS,BS,BS,BS
  227. KBYTES      DB     "     ","k.$"
  228.  
  229. MSG6      DB     CR,LF,LF
  230.       DB     "MEMORY SIZE ALTERED...  ASKING BIOS FOR RE-BOOT...$"
  231.  
  232. MSG7      DB     CR,LF,LF
  233.       DB     "RAMSET COMPLETE !"
  234.       DB     CR,LF,LF,"$"
  235.  
  236. START:
  237.       PUSH     DS               ;CHECK OUT THE
  238.       MOV     AX,040h           ;CONTROL INFORMATION AREA
  239.       MOV     DS,AX               ;IF THE
  240.       MOV     BX,0f0H           ;INTRA-APPLICATION COM AREA
  241.       MOV     AX,[BX]           ;IF WE FIND AN "!"
  242.           CMP    AX,"!"                ;THEN WE'VE BEEN HERE BEFORE
  243.       JNE     FIRST               ;AND SHOULD SIMPLY TERMINATE
  244.       JMP     FINISH
  245. FIRST:
  246.       POP     DS
  247.       MSG     MSG1               ;DISPLAY PROGRAM IDENTIFICATION
  248.  
  249.       CALL     GET_PARM           ;GET DRIVER PARMS FROM CONFIG.SYS
  250.       MSG     MSG2               ;THEN DISPLAY IT...
  251.  
  252.       CALL     GET_ID            ;GET ROM IDENTIFICATION
  253.       MSG     MSG3
  254.  
  255.       MSG     MSG4               ;DISPLAY INDICATED MEMORY SIZE...
  256.  
  257.       INT     12h               ;ROM BIOS MEMSIZE INTERRUPT
  258.       MOV     MEM_SIZE,AX           ;SAVE K-BYTES RETURNED IN AX
  259.  
  260.       MOV     BX,OFFSET KBYTE1      ;MEM SIZE ASCII STRING
  261.       CALL     CNV_ASCII           ;CONVERT TO ASCII
  262.       MSG     KBYTE1            ;DISPLAY "K" BYTES
  263.       MSG     MSG5               ;DISPLAY ACTUAL MEMORY SIZE...
  264.  
  265.       XOR     AX,AX               ;SET NMI MASK
  266.       OUT     0a0h,AL           ;TO DISABLE PARITY ERRORS
  267.  
  268.       MOV     AX,MEM_SIZE           ;GET MEM SIZE IN K-BYTES
  269.       MOV     CL,6               ;SETUP SHIFT COUNT
  270.       SHL     AX,CL               ;SHIFT K-BYTES TO SEGMENT
  271.       MOV     TEST_PARA,AX           ;SAVE HIGH MEMORY PARAGRAPH ADDR
  272.  
  273. TESTMEM:
  274.       MOV     BX,0               ;SETUP INDEX
  275.       MOV     AX,TEST_PARA           ;GET ADDREDD OF PARAGRAPH TO TEST
  276.       CMP     AX,0b000h           ;ADDRESS OF THE DISPLAY ADAPTER? (704k)
  277.       JE     SETRAM            ;YUP... AS FAR AS WE GO
  278.                        ;NOPE... VALIDATE THE TEST PARAGRAPH
  279.       PUSH     DS               ;SAVE CURRENT PROGRAM DATA SEGMENT
  280.       MOV     DS,AX               ;GET ADDRESS OF CURRENT TEST PARAGRAPH
  281.       MOV     [BX],AX           ;WRITE TO IT...
  282.       MOV     CX,[BX]           ;READ IT BACK...
  283.       POP     DS               ;RESTORE CURRENT PROGRAM DATA SEGMENT
  284.       CMP     AX,CX               ;DID WE READ WHAT WE WROTE?
  285.       JNE     SETRAM            ;NOPE...  ONE TOO MANY PARAGRAPHS
  286.  
  287.       MOV     CX,03fffh           ;YUP...    INITIALIZE THIS PARAGRAPH
  288.       MOV     ES,AX               ;SETUP ES FOR A STRING OPERATION
  289.           XOR    AX,AX                 ;SETUP TO STORE X'0000'
  290.       XOR     DI,DI               ;SETUP INITIAL OFFSET
  291.       REP     STOSW               ;STORE...
  292.  
  293.       MOV     AX,TEST_PARA           ;GET LAST PARAGRAPH TESTED
  294.       MOV     CL,6               ;SETUP SHIFT COUNT
  295.       SHR     AX,CL               ;SHIFT PARAGRAPH TO K-BYTES
  296.       MOV     BX,OFFSET KBYTES      ;MEM SIZE ASCII STRING
  297.       CALL     CNV_ASCII           ;CONVERT TO ASCII
  298.       MSG     KBYTE2            ;DISPLAY "K" BYTES
  299.  
  300.       MOV     AX,TEST_PARA           ;GET LAST PARAGRAPH USED
  301.       ADD     AX,400h           ;INCREMENT FOR NEXT PARAGRAPH
  302.       MOV     TEST_PARA,AX           ;SAVE NEW HIGH MEMORY PARAGRAPH
  303.       JMP     TESTMEM           ;GO TEST IT...
  304.  
  305. SETRAM:
  306.       MOV     AL,80h            ;SET NMI MASK
  307.       OUT     0a0h,AL           ;TO ENABLE PARITY ERRORS
  308.  
  309.       MOV     AX,TEST_PARA           ;GET LAST PARAGRAPH TESTED
  310.       MOV     CL,6               ;SETUP SHIFT COUNT
  311.       SHR     AX,CL               ;SHIFT PARAGRAPH TO K-BYTES
  312.       MOV     BX,OFFSET KBYTES      ;MEM SIZE ASCII STRING
  313.       CALL     CNV_ASCII           ;CONVERT TO ASCII
  314.       MSG     KBYTE2            ;DISPLAY "K" BYTES
  315.  
  316.       MOV     AX,TEST_PARA           ;GET LAST PARAGRAPH TESTED
  317.       MOV     CL,6               ;SETUP SHIFT COUNT
  318.       SHR     AX,CL               ;SHIFT PARAGRAPH TO K-BYTES
  319.       PUSH     DS               ;SAVE CURRENT PROGRAM DATA SEGMENT
  320.       MOV     BX,40h            ;POINT TO BIOS MEM_SIZE
  321.       MOV     DS,BX
  322.       MOV     BX,13h
  323.       CMP     [BX],AX           ;SAME AS WHAT WE JUST FOUND?
  324.       JE     FINISH            ;THEN TERMINATE NORMALLY
  325.  
  326.       MOV     [BX],AX           ;ELSE... UPDATE WITH NEW MEM_SIZE
  327.  
  328.       MOV     BX,0f0h           ;GET OFFSET OF ICA
  329.       MOV     AX,"!"            ;INDICATE THAT WE WERE HERE
  330.       MOV     [BX],AX
  331.  
  332.       POP     DS               ;RESTORE CURRENT PROGRAM DATA SEGMENT
  333.       MSG     MSG6               ;NOTIFY ABOUT RESET OF CONTROL BLOCKS
  334.       XOR     AX,AX
  335.       INT     19h               ;ASK BIOS FOR RE-BOOT
  336.  
  337. FINISH:
  338.       POP     DS               ;RESTORE CURRENT PROGRAM DATA SEGMENT
  339.       MSG     MSG7               ;NOTIFY MEMORY SET CORRECTLY
  340.       RET                   ;RETURN TO CALLER
  341.  
  342. GET_PARM  PROC     NEAR               ;GET DEVICE DRIVER COMMAND LINE
  343.       PUSH     DS               ;SET UP DS/ES FOR STRING OPERATION
  344.       PUSH     DS
  345.       POP     ES               ;ORIGIN...
  346.       MOV     BX,RH_OFF           ;SEGMENT = REQUEST HEADER
  347.       MOV     AX,RH_SEG           ;OFFSET    = BPB POINTER
  348.       MOV     DS,AX
  349.       LDS     SI,RH.BPB_PTR           ;DESTINATION...
  350.       MOV     DI,OFFSET DEV_PARM    ;TEXT FOR MSG3
  351.       MOV     CX,LENGTH DEV_PARM
  352. GET_CHR:
  353.       LODSB                ;GET ONE CHARACTER
  354.       CMP     AL,LF               ;IS IT A LINE FEED?
  355.       JZ     GET_LST           ;YUP... END OF PARM
  356.       STOSB                ;NO...  STORE IT
  357.       LOOP     GET_CHR           ;       LOOP FOR NEXT CHARACTER
  358. GET_LST:
  359.       POP     DS               ;POINT TO OUR DATA SEGMENT
  360.       MOV     AX,"$"            ;TERMINATE THE PARM STRING
  361.       STOSB                ;WITH END MESSAGE CHARACTER
  362.       RET
  363. GET_PARM  ENDP
  364.  
  365.  
  366. GET_ID      PROC     NEAR               ;GET ROM BIOS RELEASE DATE
  367.       PUSH     DS               ;SET UP DS/ES FOR STRING OPERATION
  368.       PUSH     DS
  369.       POP     ES
  370.       LEA     DI,ROM_DATE
  371.       MOV     AX,0f000h           ;SEGMENT = ROM BIOS
  372.       MOV     DS,AX
  373.       MOV     SI,0fff5h           ;OFFSET = RELEASE MARKER
  374.       MOV     CX,8
  375.       REP     MOVSB               ;MOVE IT TO OUR DATA SEGMENT
  376.       POP     DS
  377.       RET
  378. GET_ID      ENDP
  379.  
  380.  
  381. CNV_ASCII PROC     NEAR               ;CONVERT BINARY TO ASCII
  382.  
  383.       PUSH     DX               ;SAVE WORKING REGS
  384.       PUSH     SI
  385.       MOV     CX,5               ;SETUP TO FILL ASCII STRING
  386.  
  387. CVA_FILL: MOV    BYTE PTR [BX],' '
  388.       INC     BX
  389.       LOOP     CVA_FILL
  390.  
  391.       MOV     SI,10               ;SETUP DIVISOR FOR BASE 10
  392.  
  393. CVA_DVD:  SUB     DX,DX               ;CLEAR REMAINDER
  394.       DIV     SI               ;DIVIDE AX BY 10
  395.           ADD    DX,'0'                ;CONVERT REMAINDER TO ASCII
  396.       DEC     BX               ;BACK THROUGH OR STRING
  397.       MOV     [BX],DL           ;STORE THE CHARACTER
  398.       INC     CS               ;COUNT CONVERTED CHARACTERS
  399.       OR     AX,AX               ;ANY BINARY LEFT?
  400.       JNZ     CVA_DVD           ;THEN DIVIDE AGAIN
  401.  
  402.       POP     SI               ;RESTORE REGISTERS
  403.       POP     DX
  404.       RET
  405. CNV_ASCII ENDP
  406.  
  407.  
  408. MEMSET      ENDP
  409.  
  410. CODE      ENDS
  411.       END
  412.